{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 2-layer FNN on MNIST\n",
    "\n",
    "This is MLP (784-200-200-10) on MNIST. Adam algorithm (lr=0.001) with 100 epoches.\n",
    "\n",
    "\n",
    "#### 100 hidden units\n",
    "\n",
    "    Total params: 89,610\n",
    "    Trainable params: 89,610\n",
    "    Non-trainable params: 0\n",
    "\n",
    "####  200 hidden units\n",
    "\n",
    "    Total params: 199,210\n",
    "    Trainable params: 199,210\n",
    "    Non-trainable params: 0\n",
    "\n",
    "####  200 hidden units with 10 intrinsic dim\n",
    "\n",
    "    Total params: 2,191,320\n",
    "    Trainable params: 10\n",
    "    Non-trainable params: 2,191,310\n",
    "    \n",
    "####  200 hidden units with 5000 intrinsic dim    \n",
    "    Total params: 996,254,210\n",
    "    Trainable params: 5,000\n",
    "    Non-trainable params: 996,249,210    "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import os, sys\n",
    "import numpy as np\n",
    "from matplotlib.pyplot import *\n",
    "%matplotlib inline\n",
    "\n",
    "\"\"\" Extract final stats from resman's diary file\"\"\"\n",
    "def extract_num(lines0, is_reg=False):\n",
    "\n",
    "    if is_reg:\n",
    "        valid_loss_str     = lines0[-5]\n",
    "        valid_accuracy_str = lines0[-6]\n",
    "        train_loss_str     = lines0[-8]\n",
    "        train_accuracy_str = lines0[-9]\n",
    "        average_time_str   = lines0[-10]        \n",
    "        run_time_str       = lines0[-11]   \n",
    "        \n",
    "    else: \n",
    "        valid_loss_str     = lines0[-6]\n",
    "        valid_accuracy_str = lines0[-7]\n",
    "        train_loss_str     = lines0[-10]\n",
    "        train_accuracy_str = lines0[-11]\n",
    "        average_time_str   = lines0[-12]        \n",
    "        run_time_str       = lines0[-13]\n",
    "\n",
    "\n",
    "    valid_loss     = float(valid_loss_str.split( )[-1])\n",
    "    valid_accuracy = float(valid_accuracy_str.split( )[-1])\n",
    "    train_loss     = float(train_loss_str.split( )[-1])\n",
    "    train_accuracy = float(train_accuracy_str.split( )[-1])\n",
    "    run_time       = float(run_time_str.split( )[-1])\n",
    "    \n",
    "    return valid_loss, valid_accuracy, train_loss, train_accuracy, run_time\n",
    "\n",
    "\"\"\" Extract number of total parameters for each net config from resman's diary file\"\"\"\n",
    "def parse_num_params(line0):\n",
    "    line_str = ''.join(lines0)\n",
    "    idx = line_str.find(\"Total params\")\n",
    "    param_str = line_str[idx+14:idx+14+20] # 14 is the length of string \"Total params: \"\n",
    "    param_num = param_str.split(\"\\n\")[0]\n",
    "    return int(locale.atof(param_num))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "../results/fnn_mnist_l2_dir_reg\n",
      "['1', '0.1', '0.01', '0.001', '0.0001', '0.00001', '0.000001', '0.0000001', '0.00000001', '0.000000001', '0']\n",
      "17.10.06.13.56.52.078   final_stats val_accuracy 0.1009\n",
      "\n",
      "L2 penalty: 1\n",
      "(2.30513, 0.1009, 2.30388, 0.10786, 107.788)\n",
      "\n",
      "17.10.06.13.59.21.789   final_stats val_accuracy 0.3702\n",
      "\n",
      "L2 penalty: 0.1\n",
      "(2.26632, 0.3702, 2.27208, 0.3774, 121.687)\n",
      "\n",
      "17.10.06.13.57.06.191   final_stats val_accuracy 0.8779\n",
      "\n",
      "L2 penalty: 0.01\n",
      "(0.834621, 0.8779, 0.830635, 0.89026, 106.953)\n",
      "\n",
      "17.10.06.13.57.09.119   final_stats val_accuracy 0.9697\n",
      "\n",
      "L2 penalty: 0.001\n",
      "(0.250095, 0.9697, 0.240817, 0.972, 105.023)\n",
      "\n",
      "17.10.06.13.57.09.726   final_stats val_accuracy 0.979\n",
      "\n",
      "L2 penalty: 0.0001\n",
      "(0.0960051, 0.979, 0.0398964, 0.99892, 105.282)\n",
      "\n",
      "17.10.06.13.59.29.778   final_stats val_accuracy 0.9818\n",
      "\n",
      "L2 penalty: 0.00001\n",
      "(0.0738053, 0.9818, 0.00647127, 1.0, 117.099)\n",
      "\n",
      "17.10.06.13.56.49.973   final_stats val_accuracy 0.982\n",
      "\n",
      "L2 penalty: 0.000001\n",
      "(0.0997598, 0.982, 0.00143469, 1.0, 107.207)\n",
      "\n",
      "17.10.06.13.57.05.129   final_stats val_accuracy 0.9828\n",
      "\n",
      "L2 penalty: 0.0000001\n",
      "(0.105701, 0.9828, 0.00018196, 1.0, 105.728)\n",
      "\n",
      "17.10.06.13.59.47.417   final_stats val_accuracy 0.9827\n",
      "\n",
      "L2 penalty: 0.00000001\n",
      "(0.107839, 0.9827, 3.17159e-05, 1.0, 119.962)\n",
      "\n",
      "17.10.06.13.57.04.261   final_stats val_accuracy 0.9837\n",
      "\n",
      "L2 penalty: 0.000000001\n",
      "(0.106336, 0.9837, 1.62128e-05, 1.0, 104.502)\n",
      "\n",
      "17.10.06.13.56.47.656   final_stats val_accuracy 0.9837\n",
      "\n",
      "L2 penalty: 0\n",
      "(0.0994206, 0.9837, 1.54391e-05, 1.0, 92.7551)\n",
      "\n",
      "(11, 5)\n"
     ]
    }
   ],
   "source": [
    "results_dir = '../results/fnn_mnist_l2_dir_reg' \n",
    "print results_dir\n",
    "\n",
    "l2_value = [1,0.1,0.01,0.001,0.0001,0.00001,0.000001,0.0000001,0.00000001,0.000000001,0]\n",
    "\n",
    "l2_value_str = []\n",
    "for i in range(len(l2_value)):\n",
    "    if i<len(l2_value)-1:       \n",
    "        v = format(l2_value[i], '.'+str(i)+'f') \n",
    "    else:    \n",
    "        v = format(l2_value[i], '.'+str(0)+'f') \n",
    "    l2_value_str.append(v)\n",
    "    \n",
    "print l2_value_str\n",
    "# dim = [0,250,500,750,1000,1250,1500,1750,1900,1950,2000,2050,2100,2250,2500,3000,4000,5000,5250,5500,5750,6000,6250,6500,6750,7000,7250,7500,7750,8000,8250,8500,8750,9000,9250,9500,9750,10000,15000,20000,25000,30000,35000,40000,45000,50000]\n",
    "dim = [0]\n",
    "\n",
    "# filename list of diary\n",
    "diary_names = []\n",
    "for subdir, dirs, files in os.walk(results_dir):\n",
    "    for file in files:\n",
    "        if file == 'diary':\n",
    "            fname = os.path.join(subdir, file)\n",
    "            diary_names.append(fname)\n",
    "# print diary_names\n",
    "          \n",
    "Rs = []    \n",
    "diary_names_ordered = []\n",
    "error_files = []\n",
    "\n",
    "for l2 in l2_value_str:\n",
    "    for d in dim:\n",
    "        for f in diary_names:\n",
    "            if '_'+str(d)+ '_2_200_'+ l2 +'/' in f:\n",
    "                # print \"%d is in\" % d + f\n",
    "                diary_names_ordered.append(f)        \n",
    "\n",
    "                with open(f,'r') as ff:\n",
    "                    lines0 = ff.readlines()\n",
    "                    try:\n",
    "                        R = extract_num(lines0, l2=='0')\n",
    "                    except ValueError: \n",
    "                        error_files.append((l2,d))\n",
    "                        R = np.zeros(len(R))\n",
    "                        print \"Error. Can not read config: reg %f and dim %d.\" % (l2, d) \n",
    "\n",
    "                    print \"L2 penalty: \"+l2+ \"\\n\"  + str(R) + \"\\n\"                \n",
    "\n",
    "                    Rs.append(R)\n",
    "                                        \n",
    "Rs = np.array(Rs)\n",
    "print Rs.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Performance comparison with Baseline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n1lgeAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f7b5dade050>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAVwAAAEYCAYAAAAQ305WAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xl8VNX5+PHPk40QlkBYwppliIAIbqDlW79WFCzWBXel\njRarFaq2dWm1ViuiX/kW5avSaquC7c8FVKpQcUOtStQqtKJ1AxRk3xeBhJAEsjy/P+5MCMkkc5PM\nzJ3JPO/X674mc+Yuz8nok8O5554jqooxxpjIS/I6AGOMSRSWcI0xJkos4RpjTJRYwjXGmCixhGuM\nMVFiCdcYY6LEEq4xxkSJJVxjjIkSS7jGGBMllnCNMSZKUrwOIJq6d++ueXl5XofRpP3799OhQwev\nw4gYq1/8a+t1bEn9Pv74412q2iPUfgmVcPPy8li6dKnXYTSpqKiIUaNGeR1GxFj94l9br2NL6ici\n693sF/UuBRHpJyIPichiESkTERWRPJfHJonIb0VknYhUiMhnInJhZCM2xpjw8KIPtwC4BNgDvN/M\nY/8HmAI8DPwAWAI8LyJnhjNAY4yJBC+6FN5T1WwAEfkp8H03B4lIT+DXwDRV/T9/8SIRKQCmAa9F\nIlhjjAmXqLdwVbWmhYeOBdKA2fXKZwPDRCS/VYHVMeeLOeTNyCPpriTyZuQx54s54Tp1yGue9u5p\nUblmtOto9TMmvm6aHQUcAL6pV77M/zoEWNvai8z5Yg4TX55IWWUZAOuL1zPx5YkAFA4rbO3pY+Ka\ndr34vp6JX+Llig/+LoVZQL6qrgux70xgnKr2qldeAKwCfqyqTzd1js75nXXk3SObjOn9De9TUVXR\noDw9JZ2Tc05u8tiWivY1E/V67VPac86gc0hNSiUlKaXRLdTnKUkppCYf2ue6165jV9muBtfLzcxl\n3Q3rwl4/r9kohYZE5GNVHRFqv3hq4baIiEwEJgKk9k5ly64tTe4f7H/UQHmoY1sq2tdM1OuVV5Wz\neM1iqrU65FZDS3u+DtlQvIGioqJWnyfWlJaWtsl6BUSyfvGUcPcAXURE9PBmeZb/dXewg1R1JjAT\nYMSIEbr0xqbH4ebNyGN9ccMhdbmZuXx5w5ctiTukaF8zka/ntsVZozVU11RTVVPV6FZZU0lVTRVj\nnhrD1tKtDc6hKI/uepRJwycxKm8UItLaqsUEa+G2XDw92rsMaAcMqFc+xP+6PBwXmTp6KhmpGYeV\nZaRmMHX01HCcPiauadcLLUmSSE1OpX1qezq160TX9l3p0aEHvTv1pn9mf/K75jOw20CG9BjC9O9P\nb3C99JR0xg4Yyxur3+C0p05j0MODmP7BdHbs3xGWOpr4FE8J93WgEqh/F+Iy4EtVbfUNM3Bucsw8\nZya5mbkIQm5mLjPPmRnRmx/RvqZdL/LXe3zc47x+2etsuWkLT533FNkds7nlrVvo90A/xr8wnnfW\nvoOtmJ2AVDXqG3CRf3sEUOAa//tT6uxTBfyl3nHTgArgJmCU//ga4Gw31x0+fLi6MXu2am6uqojz\nOnu2q8Na5dA1a6JyTS/qqKq6aNGi6FzII03Vb9mOZXrDwhu067SuyhS04I8Fet8/79PtpdujF2AY\nJPJ32BhgqbrJfW52CvfmT7LBtqJ6+zxR77hk4HfAepwhYp8DF7m9rpuEO3u2akaG85sJbBkZkU1I\n0b6mV3W0PyiOsoNl+vRnT+vJfz1ZmYKm3p2qlzx/ib61+i2trqmOfJCtZAm3IbcJ19NhYdGWmjpC\ns7Kavmm2axfUBLlBnZwMPh+kpDhbcvKhn1tb9thjUFLS8JqZmXD99YfeB76qul9ZU2WNff7II41f\n7+abnfjCtaWkwNtvw333QUWdwQPp6fC738FZZznvRQ5tdd839Vlj7196CW67DcrLD10vIwNmzoTC\nCPUMzZkDt98OGzYoOTnC1KnurrVi5wpmfjyTJz97kj0VeyjIKuDq46/mimOvoGeHnpEJtpXspllD\nboeFJVTC7dlzhF54YdMJ99FHG//shz+EqqpDW3X14e9bWlY3MYRSN8m4KQv2+YED7q/X1mRmOsm3\nQwdnC/Wzm31ffRVuvBHKyg5dp7kJvqKqgnnL5zHzk5m8t/49UpNSOW/weUwaPolT808lSWLndosl\n3IZsHG4QOTlO664pCxfC+iATreXmwjPPRCauvLzGr7luXfSul5MDq1Y5fwzCtVVVwemnH97CDhCB\n+fPrdmw45Y29b+qzuu+vuKLxuk+Y4CTG/fudLfDzzp0Ny6qqWvLbdZSVwXXXQWUlDBgABQXQq9fh\nfwjrSk9Jp/DoQgqPLmTFzhXM+mQWT372JM8vf54BXQdw9fFX85PjfhKzrV7jTkK1cEeMGKGh5sOd\nMwcmTmxda6W5on3NaF8vVv6gNPd6Bw8eSr7BknTg54kT3Z0vI8PplioocJJwIBEPGOD8sUup1/yp\n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\n6QcOHHCdkEWkxcuv111C3SSGgm4+VuEsmX5STmKtTWddChE054s55M3II+muJPJm5DHnixhcshdn\nifOCggLee+89Ro4cSfv27Zk82Zly+KmnnuKUU06hR48edOrUieHDh/PMM4fP9x6sS+HWW28lJSWF\nVatWMXbsWDp06EB+fj7333//YX13toR64hnaLw+Ab75NvBtn1sKNkDlfzGHiyxMpq3Qm315fvJ6J\nL08EoHBYjC37gLOC7uWXX85vfvMbhgwZQocOHQBnKsRAQgZYtGgRl19+OQcPHgw5W5eqcsEFF3DV\nVVdx8803M3/+fO666y4GDRrED3/4wyaPDSyh/tvf/pauXbty7733csEFF7By5crahScDS6hfdNFF\nzJgxg+3bt3PNNddQUVHBscce2/pfiomIgb50WNGHZVsSbyyuJdwQbnj9Bj7d1vx10pdsWsKB6sOX\n6C2rLOOqBVcx6+PG10mvrq4mud466cf2OpYZZ0RonXS/4uJi5s6dy9ixh89+eeedd9b+XFNTw6mn\nnsrGjRt55JFHQibcmpoabrvtttrkOnr0aN58802effbZkAnXllBvu3w+4EMfK3cmXgvXuhQipH6y\nDVXutYyMjAbJFuCrr77ikksuoU+fPqSkpJCamsrs2bP5+uuvXZ33rLPOqv1ZRDjyyCNr10Brii2h\n3nb5fMDefDaWJl7CtRZuCC1tWebNyGN9ccN10nMzcym6oqjR4/bt2xfVZdIDevXq1aBs7969jBkz\nhqysLKZPn05+fj5paWnMmDGjwcKOwSQnJ9O5c+fDytLS0mqXQW+KLaHedvXrB1LsY0/VbA5UHaBd\nSnhGy8QDS7gRMnX01MP6cAEyUjOYOjrG1kn3E2kwGybvv/8+mzdv5sUXX2TEiBG15ZWVldEMLahQ\nS6hb0o1dKSnQI9nHDlHWF69nYLeBXocUNdalECGFwwqZec5McjNzEYTczFxmnjMzJm+YNSaw2m5q\nampt2Y4dO3jttde8CqmWLaEe33I6J+asYdbCjaDCYYVxlWDrO/nkk+nQoQOTJk1i8uTJlJSUcPfd\nd5Odnc2mTZu8Do+7776bc845h4svvpgrr7ySbdu2cdddd5GdnU1SkrUlYtngnj6W4kxEnkjsv0rT\nqD59+jBv3jzKy8u58MILueOOO/jFL37R4EaVV84++2yeeOIJPv30U8477zweeOABHn74Ybp27Upm\n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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f7b5d97f250>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "N = 11\n",
    "\n",
    "# plot nll\n",
    "fig, ax = subplots(1)\n",
    "\n",
    "font = {'family' : 'normal',\n",
    "        'weight' : 'normal',\n",
    "        'size'   : 16}\n",
    "matplotlib.rc('font', **font)\n",
    "\n",
    "ax.plot(l2_value, Rs[:,0],'bo-', label=\"Testing\")\n",
    "ax.plot(l2_value, Rs[:,2],'go-', label=\"Training\")\n",
    "\n",
    "ax.set_xlabel('L2 penalty')\n",
    "ax.set_ylabel('NLL')\n",
    "ax.set_xscale('log')\n",
    "ax.legend()\n",
    "ax.grid()\n",
    "# ax.set_ylim([-0.1,1.1])\n",
    "fig.set_size_inches(5, 4)\n",
    "\n",
    "\n",
    "\n",
    "# plot acc\n",
    "fig, ax = subplots(1)\n",
    "\n",
    "font = {'family' : 'normal',\n",
    "        'weight' : 'normal',\n",
    "        'size'   : 16}\n",
    "matplotlib.rc('font', **font)\n",
    "\n",
    "ax.plot(l2_value, Rs[:,1],'bo-', label=\"Testing\")\n",
    "ax.plot(l2_value, Rs[:,3],'go-', label=\"Training\")\n",
    "\n",
    "ax.set_xlabel('L2 penalty')\n",
    "ax.set_ylabel('Accuray')\n",
    "ax.set_xscale('log')\n",
    "ax.legend()\n",
    "ax.grid()\n",
    "ax.set_ylim([0.5,1.02])\n",
    "fig.set_size_inches(5, 4)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Performance Per Dim"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
